(function($){
	
	$.fn.menu = function(config){
		
		return this.each(function(){
			var menu = $.data(this, 'ui-menu');
			if(!menu){
				var m = new $.ui.menu(this, config);
				//临时的hack手段，不通用
				m.showAt({x : $(this).offset().left + 32 - m.getWidth(), y : $(this).offset().top + $(this).height()});
				return m;
			}else{
				menu.showAt({x : $(this).offset().left + 32 - menu.getWidth(), y : $(this).offset().top + $(this).height()});
				return menu;
			}
		});
	}
	
	$.ui = $.ui || {};
	
	$.ui.menu = function(el, config){
		
		$.extend(this, config);
		
		this.id = this.id || $.utils.id();
		
		$.data(el, 'ui-menu', this);
		
		this.render();
		
	}
	
	$.extend($.ui.menu.prototype, {
		
		createEl : function(){
			var parentEl = this.parentEl || document.body;
			
			return $('<div class="playlist_menu" style="position:absolute;z-index:9001;width:100px;"></div>').appendTo(parentEl);
	
		},
		
		//private
		render : function(){
			if(this.el){
				return;
			}
			
			var self = this;
			var el = this.el = this.createEl();
			var ul = $('<ul></ul>').appendTo(el);
			
			for(var i=0; i<this.items.length; i++){
				var item = this.items[i];
				if('-' == item){
					$('<li class="menu_divider"></li>').appendTo(ul);
				}else if($.utils.isObject(item) && !!item.text && !!item.handler){
					var $li = $('<li><a href="#" onclick="return false;">' + item.text + '</a></li>').appendTo(ul);
					(function(mi){
						$li.bind('click', function(e){
							self.hide();
							mi.handler.apply(mi, [e]);
						});
					})(item);
				}
			};
			
		},
		
		showAt : function(xy){
			var self = this;
			if(!this.el){
				this.render();
			}
			$(this.el).css({left : xy.x, top : xy.y}).show();
			$(document).bind('mousedown', function(e){self.onMouseDown(e)});
			this.hidden = false;
		},
		
		hide : function(){
			$(this.el).hide();
			$(document).unbind('mousedown', this.onMouseDown);
			this.hidden = true;
		},
		
		onMouseDown : function(e){
			var t = e.target;
			if(!($.utils.findParent(t, '.playlist_menu'))){
				this.hide();
			}
		},
		
		getWidth : function(){
			return this.el.width() || 0;
		}
	});
	
})(jQuery);